from django.shortcuts import render
from rest_framework import viewsets
from rest_framework.views import APIView
from .utils import get_responser
from .serializers import AbsentSerializer, AbsentTypeSerializer
from rest_framework.response import Response
from .models import Absent, AbsentType, AbsentStatusChoices
from apps.oaauth.serializers import UserSerializer

# AbsentViewSet类用于处理缺勤记录的增删查改操作
class AbsentViewSet(viewsets.ModelViewSet):
    # 设置查询集为所有的缺勤记录
    queryset = Absent.objects.all()
    # 指定序列化器类为AbsentSerializer
    serializer_class = AbsentSerializer

    # 重写update方法以支持部分更新，partial=True表示允许仅更新部分字段
    def update(self, request, *args, **kwargs):
        kwargs['partial'] = True  # 设置partial为True，允许部分更新
        return super().update(request, *args, **kwargs)  # 调用父类的update方法执行更新操作

    # 重写list方法，获取缺勤记录列表，根据查询参数返回不同数据
    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()  # 获取所有缺勤记录
        who = request.query_params.get('who')  # 从请求参数中获取'who'参数

        # 判断who参数，决定返回的记录是请求者的还是其下属的
        if who and who == 'sub':
            # 返回属下的考勤信息
            result = queryset.filter(responser=request.user)  # 筛选出属下的缺勤信息
        else:
            # 返回自己的考勤信息
            result = queryset.filter(requester=request.user)  # 筛选出请求者自己的缺勤信息

        # result代表符合查询条件的数据
        # 使用paginate_queryset方法实现分页
        page = self.paginate_queryset(result)  # 分页查询结果
        if page is not None:
            serializer = self.get_serializer(page, many=True)  # 对分页结果进行序列化
            return self.get_paginated_response(serializer.data)  # 返回分页后的响应

        # 如果没有分页处理，直接序列化结果集
        serializer = self.serializer_class(result, many=True)
        return Response(data=serializer.data)  # 返回序列化数据的响应

# AbsentTypeViewSet类用于获取所有的缺勤类型
class AbsentTypeViewSet(APIView):
    # 处理GET请求，获取缺勤类型列表
    def get(self, request):
        types = AbsentType.objects.all()  # 查询所有的缺勤类型
        serializer = AbsentTypeSerializer(types, many=True)  # 对查询结果进行序列化
        return Response(data=serializer.data)  # 返回序列化数据的响应

# ResponserView类用于获取审批人信息
class ResponserView(APIView):
    # 处理GET请求，获取当前请求的审批人信息
    def get(self, request):
        # 调用get_responser工具方法获取审批人对象，并使用UserSerializer进行序列化
        return Response(data=UserSerializer(get_responser(request)).data)  # 返回审批人信息的响应
